package com.tjetc.myservlet;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

/**
 * 用来封装请求
 * 我们简化操作 只处理Get请求
 *
 * @author gaoyongxiang
 * @version v1.0
 * @date 2025/9/1
 */
public class MyHttpRequest {
    // 请求方式
    private String method;
    // 请求地址
    private String uri;
    // 请求参数
    private Map<String, String> params = new HashMap<>();
    // 以上内容 要通过socket中的输入流拿到数据
    private InputStream inputStream;

    public MyHttpRequest(InputStream inputStream) {
        this.inputStream = inputStream;
        // 只要存在请求对象数据就应该都有了

        encapsulationHttpRequest();

    }

    // 封装请求方法
    private void encapsulationHttpRequest() {
        try {
            // 包装成字符流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));

            /*
               GET /?num1=1&num2=2 HTTP/1.1
                Host: localhost:8080
                User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:136.0) Gecko/20100101 Firefox/136.0
             */

            String data = bufferedReader.readLine();
            //  GET /?num1=1&num2=2 HTTP/1.1
            String[] requestData = data.split(" ");
            // 获取请求方式
            method = requestData[0];
            // 获取请求路径
            // 1. 先找到？的位置 因为？之前的内容才是地址
            int pathIndex = requestData[1].indexOf("?");
            if (pathIndex == -1) {
                // 如果没有找到说明没有请求参数
                uri = requestData[1];
            } else {
                // 将地址和参数分别赋值
                uri = requestData[1].substring(0, pathIndex);
                // 拿到所有参数 num1=1&num2=2
                String parameter = requestData[1].substring(pathIndex + 1);
                // 将num1=1  num2=2 分别放到数组中
                String[] parameters = parameter.split("&");
                for (String para : parameters) {
                    String[] split = para.split("=");
                    // 为了防止有空值的情况
                    if (split.length == 2) {
                        params.put(split[0], split[1]);
                    }
                }
            }

        } catch (Exception e) {

        }
    }


    public String getParameter(String name) {
        if (params.containsKey(name)) {
            return params.get(name);
        }else {
           return "";
        }
    }

    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }

    @Override
    public String toString() {
        return "MyHttpRequest{" +
                "method='" + method + '\'' +
                ", uri='" + uri + '\'' +
                ", params=" + params +
                ", inputStream=" + inputStream +
                '}';
    }
}